package com.zc.auth.security.core.access.meta;

import org.springframework.security.access.ConfigAttribute;
import org.springframework.util.CollectionUtils;

import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * url角色元数管理
 */
public interface UrlRoleMetaDataManager {

    /**
     * 获取全部url和角色对照表 此方法由外部调用实现缓存
     *
     * @return
     */
    default Map<String, ? extends Collection<String>> getUrlsAndRolesMap() {
        return null;
    }

    /**
     * 更新全部url和角色对照表 此方法由外部调用实现缓存
     *
     * @return
     */
    default Map<String, ? extends Collection<String>> updateUrlsAndRolesMap() {
        return null;
    }

    /**
     * 更新全部url和角色对照表 此方法由外部调用实现缓存
     *
     * @param map
     * @param serverName
     * @return
     */
    default void updateRedisUrlsAndRolesMap(Map<String, Set<String>> map, String serverName) {

    }

    /**
     * 获取全部url和角色对照表
     *
     * @return
     */
    default Map<String, Collection<ConfigAttribute>> getConfigAttributesMap() {
        return null;
    }

    /**
     * 获取能访问的角色
     *
     * @param url
     * @return
     */
    Collection<String> getAccessibleRoles(String url);


    /**
     * 获取能访问的角色
     *
     * @return
     */
    Collection<String> getAccessibleRoles(String url, Map<String, ? extends Collection<String>> map);

    /**
     * 获取url和角色对照表
     *
     * @return
     */
    default Collection<ConfigAttribute> getConfigAttributes(String url) {
        return this.getAccessibleRoles(url).stream().map(val -> new SimpleConfigAttribute(val)).collect(Collectors.toSet());
    }

    /**
     * 获取url和角色对照表
     *
     * @return
     */
    default Collection<ConfigAttribute> getConfigAttributes(String url, Map<String, ? extends Collection<String>> map) {
        Collection<String> accessibleRoles = this.getAccessibleRoles(url, map);
        return CollectionUtils.isEmpty(accessibleRoles) ? null : accessibleRoles.stream().map(val -> new SimpleConfigAttribute(val)).collect(Collectors.toSet());
    }


    /**
     * 获取全部角色
     *
     * @return
     */
    default Collection<ConfigAttribute> getAllConfigAttributes() {
        return null;
    }


}
